package design.patterns.structural;

/**
 * 组合模式
 * 解释：
 * 组合模式是一种结构型设计模式，
 * 你可以使用它将对象组合成树状结构， 并且能像使用独立对象一样使用它们。
 */

import java.util.ArrayList;
import java.util.List;

/**
 * 情景
 * 三层的管理人员，统计一共多少人
 *        1
 *      2 2 2
 *     33 3 33
 */
public class C_Composite {
    public static void main(String[] args) {
        Level level1 = new Level();

        Level level_2_1 = new Level();
        Level level_2_2 = new Level();
        Level level_2_3 = new Level();

        Level level_3_1 = new Level();
        Level level_3_2 = new Level();
        Level level_3_3 = new Level();
        Level level_3_4 = new Level();
        Level level_3_5 = new Level();

        level1.componentList.add(level_2_1);
        level1.componentList.add(level_2_2);
        level1.componentList.add(level_2_3);

        level_2_1.componentList.add(level_3_1);
        level_2_1.componentList.add(level_3_2);

        level_2_2.componentList.add(level_3_3);

        level_2_3.componentList.add(level_3_4);
        level_2_3.componentList.add(level_3_5);


        Integer count = level1.count();
        System.out.println(count);

    }
}

interface Component{
    Integer count();
}
abstract class AbstractComponent implements Component{
    List<AbstractComponent> componentList = new ArrayList<>();
}


class Level extends AbstractComponent {

    @Override
    public Integer count() {
        Integer sum = 1;
        if (this.componentList.size()==0){
            return 1;
        }

        for (AbstractComponent component : this.componentList) {
            sum +=component.count();
        }
        return sum;
    }
}

